home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************************
- File : GUSI - Grand Unified Socket Interface
- File : GUSIINETTest - Test unix domain sockets
- Author : Matthias Neeracher <neeri@iis.ethz.ch>
- Started : 02Sep92
- Modified : 08Sep92 MN First attempt
- 08Sep92 MN Factor out common socket routines
- 14Sep92 MN Misinterpreted hostent structure
- Last : 14Sep92
- *********************************************************************/
-
- #include <GUSI.h>
- #include <GUSITest.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
-
- #include "Events.h"
-
- extern int GUSIDefaultSpin(spin_msg, long);
-
- char addrstr[100];
-
- void Socket(char ch1, char, const char *)
- {
- sock = socket(AF_INET, (ch1 == 's') ? SOCK_STREAM : SOCK_DGRAM, 0);
-
- if (sock == -1) {
- printf("# socket() returned error %s\n", Explain());
- Where();
- }
- }
-
- void Bind(char ch1, char ch2, const char * cmd)
- {
- int len;
- struct sockaddr_in addr;
-
- if (sock == -1) {
- printf("# socket is not open\n");
- Where();
-
- return;
- }
-
- if (sscanf(cmd, "%s %hd", addrstr, &addr.sin_port) == 2) {
- addr.sin_addr = inet_addr(addrstr);
- addr.sin_family = AF_INET;
- len = sizeof(struct sockaddr_in);
- } else {
- Usage(ch1, ch2);
- return;
- }
-
- if (bind(sock, &addr, len)) {
- printf(
- "bind(%s:%d) returned error %s\n",
- inet_ntoa(addr.sin_addr),
- addr.sin_port,
- Explain());
-
- Where();
- }
- }
-
- void Accept(char, char, const char *)
- {
- int len;
- struct sockaddr_in addr;
-
- if (sock == -1) {
- printf("# socket is not open\n");
- Where();
-
- return;
- }
- if (accsock != -1) {
- printf("# can't accept more than one connection\n");
- Where();
-
- return;
- }
-
- len = sizeof(struct sockaddr_in);
- sock = accept(accsock = sock, &addr, &len);
-
- if (sock < 0) {
- printf("# accept() returned error %s\n", Explain());
- sock = accsock;
- accsock = -1;
- } else {
- printf(
- "# accepted connection from %s port %d\n",
- inet_ntoa(addr.sin_addr),
- addr.sin_port);
- }
-
- Where();
- }
-
- void Connect(char ch1, char ch2, const char * cmd)
- {
- int len;
- struct sockaddr_in addr;
-
- if (sock == -1) {
- printf("# socket is not open\n");
- Where();
-
- return;
- }
-
- if (sscanf(cmd, "%s %hd", addrstr, &addr.sin_port) == 2) {
- addr.sin_addr = inet_addr(addrstr);
- addr.sin_family = AF_INET;
- len = sizeof(struct sockaddr_in);
- } else {
- Usage(ch1, ch2);
- return;
- }
-
- if (connect(sock, &addr, len)) {
- printf(
- "connect(%s:%d) returned error %s\n",
- inet_ntoa(addr.sin_addr),
- addr.sin_port,
- Explain());
- Where();
- }
- }
-
- int ReadWhileUCan()
- {
- int res;
- char * outline;
- fd_set rdfds;
- fd_set exfds;
- struct timeval delay;
- char out[500];
-
- for (;;) {
- FD_ZERO(&rdfds);
- FD_ZERO(&exfds);
-
- FD_SET(sock, &rdfds);
- FD_SET(sock, &exfds);
-
- delay.tv_sec = 1;
- delay.tv_usec = 0;
-
- res = select(sock+1, &rdfds, nil, &exfds, &delay);
-
- if (res < 0) {
- printf("# select() returned error %s\n", Explain());
-
- return -1;
- } else if (!res)
- return 0;
- else if (res && FD_ISSET(sock, &exfds)) {
- printf("# select() returned an exception\n");
-
- return -1;
- } else if (res && FD_ISSET(sock, &rdfds)) {
- res = read(sock, out, 500);
-
- if (res < 0) {
- printf("# read() returned error %s\n", Explain());
-
- return -1;
- }
-
- out[res] = 0;
-
- for (outline = strtok(out, "\n\r"); outline; outline = strtok(nil, "\n\r"))
- printf("%s\n", outline);
- }
- }
- }
-
- void Telnet(char, char, const char *)
- {
- int len;
- int part;
- int res;
- char * line;
- char * outline;
- fd_set rdfds;
- fd_set wrfds;
- fd_set exfds;
- struct timeval delay;
- char in[100];
- char out[500];
-
- if (sock == -1) {
- printf("# socket is not open\n");
- Where();
-
- return;
- }
-
- printf("# Entering Poor Man's Telnet mode\n");
-
- for (;;) {
- if (ReadWhileUCan())
- break;
-
- Prompt();
-
- if (!fgets(in, 100, input))
- break;
-
- ++inputline;
-
- if (!strcmp(in, ".\n"))
- break;
-
- if (!strcmp(in, "?\n"))
- continue;
-
- len = strlen(in);
- in[len++] = '\r';
- in[len] = 0;
-
- for (line = in; len; len -= part, line += part) {
- part = 0;
-
- FD_ZERO(&rdfds);
- FD_ZERO(&wrfds);
- FD_ZERO(&exfds);
-
- FD_SET(sock, &rdfds);
- FD_SET(sock, &wrfds);
- FD_SET(sock, &exfds);
-
- delay.tv_sec = 10;
- delay.tv_usec = 0;
-
- res = select(sock+1, &rdfds, &wrfds, &exfds, &delay);
-
- if (res < 0) {
- printf("# select() returned error %s\n", Explain());
-
- return;
- } else if (!res) {
- printf("# select() timed out\n");
-
- return;
- } else if (FD_ISSET(sock, &exfds)) {
- printf("# select() returned an exception\n");
-
- return;
- }
-
- if (FD_ISSET(sock, &rdfds)) {
- res = read(sock, out, 500);
-
- if (res < 0) {
- printf("# read() returned error %s\n", Explain());
-
- return;
- }
-
- out[res] = 0;
-
- for (outline = strtok(out, "\n\r"); outline; outline = strtok(nil, "\n\r"))
- printf("%s\n", outline);
- } else if (FD_ISSET(sock, &wrfds)) {
- res = write(sock, line, len);
-
- if (res < 0) {
- line[strlen(line) - 2] = 0;
- printf("# write(\"%s\") returned error %s\n", line, Explain());
-
- return;
- }
-
- part = res;
- }
- }
- }
-
- printf("# Leaving Poor Man's Telnet mode\n");
- }
-
- void N2Addr(char ch1, char ch2, const char * cmd)
- {
- struct in_addr addr;
- struct hostent * ent;
-
- if (sscanf(cmd, "%s", addrstr) == 1)
- if (ent = gethostbyname(addrstr)) {
- memcpy(&addr, ent->h_addr, sizeof(struct in_addr));
- printf("# gethostbyname(%s) returned %s\n", addrstr, inet_ntoa(addr));
- } else
- printf("# gethostbyname(%s) failed.\n", addrstr);
- else
- Usage(ch1, ch2);
- }
-
- main(int argc, char ** argv)
- {
- printf("GUSIINETTest MN 14Sep92\n\n");
-
- COMMAND('s', 's', Socket, "", "Create a stream socket");
- COMMAND('d', 's', Socket, "", "Create a datagram socket");
- COMMAND('b', 'd', Bind, "addr port", "Bind to address");
- COMMAND('c', 'o', Connect, "addr port", "Connect to address");
- COMMAND('a', 'c', Accept, "", "Accept a connection");
- COMMAND('t', 'n', Telnet, "", "Play telnet");
- COMMAND('n', 'a', N2Addr, "addr", "Convert name to address");
-
- AddSocketCommands();
-
- GUSISetEvents(GUSISIOWEvents);
- RunTest(argc, argv);
- CleanupSockets();
- }